package socketServidor;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import logica.FabricaLogicaAgencia;
import logica.ILogicaAnularAgencia;
import logica.ILogicaReporteAgencia;
import logica.ILogicaVentaAgencia;

import datatypes.*;
import entidades.Vendido;




public class EstableceComunicacion implements Runnable {
	Thread t;
	Socket socketRecepcion;
	
	public EstableceComunicacion(Socket unSocket){
		socketRecepcion = unSocket;			
	}
	
	public void start() {
		t = new Thread(this);
		t.start();
	}
	
	public void run() {		
		try {
				ObjectInputStream  	lectura;
				lectura 			= new ObjectInputStream (socketRecepcion.getInputStream());
				ObjectOutputStream 	escritura;
				escritura 			= new ObjectOutputStream(socketRecepcion.getOutputStream());				
				Object msRecibido 	= new Object();	
				int terminar 		= 0;
				while (terminar ==0){					
					try {		
						msRecibido =  lectura.readObject();
						 switch (msRecibido.getClass().getName()) { 
						 	case "datatypes.DataTicket":
							 	DataTicket dt			= (DataTicket)msRecibido;
							 	ILogicaVentaAgencia i = FabricaLogicaAgencia.getLogicaVentaAgencia();
							 	DataTicketVendido dtv = i.ventaTicket(dt); //Se comunica con el ws de la imm y la imm le retorna un ticket vendido, que lueg se graba en este SRV
							 	terminar 				= 1;
						 		escritura.writeObject(dtv);	
						 		System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Ticket Vendido, Mat: "+dt.getMatricula());
						 		break;
						 	case "datatypes.DataTicketAnular":
						 		DataTicketAnular dtar = (DataTicketAnular)msRecibido;					//DataTicketAnulado dta = new DataTicketAnulado(88,55,3,"El ticket "+dtar.getIdTicket()+" fue anulado satisfactoriamente");
						 		ILogicaAnularAgencia a = FabricaLogicaAgencia.getLogicaAnularAgencia();
						 		DataTicketAnulado dta = a.anularTicket(dtar);
						 		terminar 			  = 1;
						 		escritura.writeObject(dta);					
						 		System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Ticket Anulado, id Ticket: "+dtar.getIdTicket());
						 		break;
						 	case "java.lang.Long":
						 		long idTicket = (long)msRecibido;					//DataTicketAnulado dta = new DataTicketAnulado(88,55,3,"El ticket "+dtar.getIdTicket()+" fue anulado satisfactoriamente");
						 		ILogicaAnularAgencia b = FabricaLogicaAgencia.getLogicaAnularAgencia();
						 		Vendido ticket = b.buscarTicket(idTicket);
						 		if(ticket!=null){
						 		terminar 			  = 1;
						 		escritura.writeObject(ticket);					
						 		System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Buscar Ticket, id Ticket: "+ idTicket);
						 		}else
						 			terminar=1;
						 		break;	
						 	case "datatypes.DataLoginEnvio":
						 		DataLoginEnvio dle 		= (DataLoginEnvio)msRecibido;
							 	DataLoginRespuesta dlr 	= new DataLoginRespuesta();
							 	ILogicaReporteAgencia r = FabricaLogicaAgencia.getLogicaReporteAgencia();
							 	boolean login = r.hacerLogin(dle.getUsuario(), dle.getPassword() );
							 	if(login == true){
							 		dlr.setMensaje("");
							 		System.out.println("Login Corecto, usuario: "+dle.getUsuario());
							 	}else{
							 		dlr.setMensaje("Usuario o Password incorrecto");
							 		System.out.println("Login Incorecto, usuario: "+dle.getUsuario());
							 	}
						 		escritura.writeObject(dlr);								 		
						 		terminar = 1;
						 		break;
						 	default: System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Error, la clase es: "+msRecibido.getClass().getName() );break;							           
						 }
						} catch (ClassNotFoundException e) {
							System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Error con el tipo de paquete de datos");
							terminar = 1;
						}
					catch (Exception e){
						System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Error al recibir mensaje en del Cliente");
						terminar = 1;
					}
			    }
				} 
				catch (IOException e) {
					System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Error en la comunicacion con el cliente");
				    System.exit(-1);
				} 
		try {
			socketRecepcion.close();
		} catch (IOException e) {
			System.out.println("SrvAgencia.SocketServidor.EstableceComunicacion.Error al cerrar la conexion");
		}
	}

}
